{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Moving, rotating, mirroring"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are several actions we can take to move and rotate PHIDL objects.  These actions include movement, rotation, and reflection. There are several types of PHIDL objects (`Device`, `DeviceReference`, `Port`, `Polygon`, `CellArray`, `Label`, and `Group`) but they all can be moved and manipulated in the same ways.\n",
    "\n",
    "## Basic movement and rotation\n",
    "\n",
    "We'll start by creating a blank Device and some shapes.  We'll add the shapes to the Device as references"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import phidl.geometry as pg\n",
    "from phidl import quickplot as qp\n",
    "from phidl import Device\n",
    "\n",
    "# Start with a blank Device\n",
    "D = Device()\n",
    "\n",
    "# Create some more shape Devices\n",
    "T = pg.text('hello', size = 10, layer = 1)\n",
    "E = pg.ellipse(radii = (10,5))\n",
    "R = pg.rectangle(size = (10,3), layer = 2)\n",
    "\n",
    "# Add the shapes to D as references\n",
    "text = D << T\n",
    "ellipse = D << E\n",
    "rect1 = D << R\n",
    "rect2 = D << R\n",
    "\n",
    "qp(D) # quickplot it!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's practice moving and rotating the objects:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "text.move([10,4]) # Translate by dx = 10, dy = 4\n",
    "ellipse.move(origin = [1,1], destination = [2,2.5]) # Translate by dx = 1, dy = 1.5\n",
    "rect1.move([1,1], [5,5], axis = 'y') # Translate by dx = 0, dy = 4 (motion only along y-axis)\n",
    "rect2.movey(4) # Same as specifying axis='y' in the move() command\n",
    "rect2.movex(4) # Same as specifying axis='x'' in the move() command\n",
    "ellipse.movex(30,40) # Moves \"from\" x=30 \"to\" x=40 (i.e. translates by dx = 10)\n",
    "\n",
    "rect1.rotate(45) # Rotate the first waveguide by 45 degrees around (0,0)\n",
    "rect2.rotate(-30, center = [1,1]) # Rotate the second waveguide by -30 degrees around (1,1)\n",
    "\n",
    "text.mirror(p1 = [1,1], p2 = [1,3]) # Reflects across the line formed by p1 and p2\n",
    "\n",
    "qp(D) # quickplot it!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Working with properties\n",
    "\n",
    "Each Device and DeviceReference object has several properties which can be used to learn information about the object (for instance where it's center coordinate is).  Several of these properties can actually be used to move the geometry by assigning them new values.\n",
    "\n",
    "Available properties are:\n",
    "\n",
    "- `xmin` / `xmax`: minimum and maximum x-values of all points within the object\n",
    "- `ymin` / `ymax`: minimum and maximum y-values of all points within the object\n",
    "- `x`: centerpoint between minimum and maximum x-values of all points within the object\n",
    "- `y`: centerpoint between minimum and maximum y-values of all points within the object\n",
    "- `bbox`: bounding box (see note below) in format ((xmin,ymin),(xmax,ymax))\n",
    "- `center`: center of bounding box"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "bounding box:\n",
      "[[-42.   4.]\n",
      " [ -9.  15.]]\n",
      "xsize and ysize:\n",
      "33.0\n",
      "11.0\n",
      "center:\n",
      "[-25.5   9.5]\n",
      "xmax\n",
      "21.0\n"
     ]
    }
   ],
   "source": [
    "print('bounding box:')\n",
    "print(text.bbox) # Will print the bounding box of text in terms of [(xmin, ymin), (xmax, ymax)]\n",
    "print('xsize and ysize:')\n",
    "print(text.xsize) # Will print the width of text in the x dimension\n",
    "print(text.ysize) # Will print the height of text in the y dimension\n",
    "print('center:')\n",
    "print(text.center) # Gives you the center coordinate of its bounding box\n",
    "print('xmax')\n",
    "print(ellipse.xmax) # Gives you the rightmost (+x) edge of the ellipse bounding box"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's use these properties to manipulate our shapes to arrange them a little better"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# First let's center the ellipse\n",
    "ellipse.center = [0,0] # Move the ellipse such that the bounding box center is at (0,0)\n",
    "\n",
    "# Next, let's move the text to the left edge of the ellipse\n",
    "text.y = ellipse.y # Move the text so that its y-center is equal to the y-center of the ellipse\n",
    "text.xmax = ellipse.xmin # Moves the ellipse so its xmax == the ellipse's xmin\n",
    "\n",
    "# Align the right edge of the rectangles with the x=0 axis\n",
    "rect1.xmax = 0\n",
    "rect2.xmax = 0\n",
    "\n",
    "# Move the rectangles above and below the ellipse\n",
    "rect1.ymin = ellipse.ymax + 5\n",
    "rect2.ymax = ellipse.ymin - 5\n",
    "\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In addition to working with the properties of the references inside the Device, we can also manipulate the whole Device if we want.  Let's try mirroring the whole Device `D`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(D.xmax) # Prints out '10.0'\n",
    "\n",
    "D.mirror((0,1)) # Mirror across line made by (0,0) and (0,1)\n",
    "\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A note about bounding boxes\n",
    "\n",
    "When we talk about bounding boxes, we mean it in the sense of the smallest enclosing box which contains all points of the geometry.  So the bounding box for the device D looks like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD4CAYAAAAJmJb0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deWwkaXrf+e8TeZJ58EgmzyRZxSpWF7uqu6u72TXTGkmQVqN1W7vY0QgQMDIsDaCB24YlQDZk2JJnsdBaECAbPtYL2F6VpbEGsFeCIGl2BpLQ2plZCSNZM33NTHfdVayDxbuSZzIzmWe8+weT3awqXnkzg88HIMiMiIz3fZnkLyPfeOMNMcaglFLKmaxmV0AppVT9aMgrpZSDacgrpZSDacgrpZSDacgrpZSDuZtdgd16enrMqVOnGlZePp/H4/E0rLxGSCQShMPhZlejppz2OjmtPeC8NrVae95///1lY0x0r3XHKuRPnTrFe++917Dy5ufnGRwcbFh5jfDWW2/xxhtvNLsaNeW018lp7QHntanV2iMi0/ut0+4apZRyMA15pZRyMA15pZRysKpDXkSGReQvROSmiFwXkV8qLe8Wka+LyN3S967qq6uUUqoctTiSLwC/bIyZAD4J/IKIPA/8CvBNY8w48M3SY6WUUg1UdcgbYxaMMd8t/bwJ3ASGgM8AXy5t9mXgJ6stSymlVHlqOoRSRE4BLwNvA33GmAXYfiMQkd59nvMm8CZALBZjfn6+llU60OrqasPKapSNjY2G/g4bwWmvk9PaA85rk5PaU7OQF5Eg8EfAPzLGJETkSM8zxlwBrgBMTk6aRo9NbaWxsEfR0dHhuDaB814np7UHnNcmp7SnJqNrRMTDdsD/N2PMH5cWL4nIQGn9APC4FmUppZQ6ulqMrhHgd4Cbxph/u2vV14DPl37+PPDVastStZNOp9nc3Gx2NZRSdVaL7ppPAT8LXBWR75eW/XPgN4E/EJEvAI+An65BWTX1pd/5jzx8cK3Z1agpQxt/+Af/14HbFAoF7k/dxdiG0+PjeI/5HB39A6MsLux71XbLcVp7wHltqrY9gWAP//7//O0a1qhyVYe8Meavgf064H+s2v3XUyazyb/+lz/S7GrU1F98K86P/vCe8xQBkMvn+eDddwkXLuC2LOLApddew+/zNa6SZYqvtBONnG52NWrGae0B57Wp2vb8k3/2l7WrTJX0itcT5OOALzDY0UFvKEQU+P6775LJZptdPaVUHWjInxBPB/wODXqlnE1D/gTYL+B3aNAr5Vwa8g53WMDv0KBXypk05B3sqAG/Q4NeKefRkHeocgN+hwa9Us6iIe9AlQb8Dg16pZxDQ95higW7qoDfoUGvlDNoyDtILp9nfnam6oDfoUGvVOvTkHeQ+bk5TDbLYDhcs31q0CvV2jTkHWRkZARPMMj91VUwpmb71aBXqnVpyDuIZVn0Dw4g3d0a9EopQEPecUSEiy++qEGvlAI05B3JsiwNeqUUoCHvWBr0SinQkHc0DXqllIa8w2nQK3Wy1epG3l8Skccicm3Xsl8TkTkR+X7p6ydqUZYqnwa9UidXrY7kfxd4Y4/l/84Yc6n09Wc1KktVQINeqZOpJiFvjPkWsFqLfan60aBX6uSp+kbeh/hFEfk54D3gl40xa09vICJvAm8CxGIx5ufn61ylj3V1RYmvtDesvEZIpbyHtqk/9jqPCtPcWt+kLxja/zbsZfK0DRDc2uL9dxc5ffYsHo+nJvtNbB7fm4xXwmntAee1qdr29A+MNjTLDlLPkP9PwK8DpvT93wA///RGxpgrwBWAyclJMzg4WMcqPWltLU40EmxYeY0QCOSIRtKHbtfT3cO1D+dZW51mrLsbpDZJ3xWCx5ubPJqa4dJrr+H31eaf/yhtaiVOaw84r03VtGdxYZpGZtlB6ja6xhizZIwpGmNs4D8Dl+tVliqfdt0odTLULeRFZGDXw88C1/bbVjWHBr1SzlerIZS/B3wbeE5EZkXkC8C/EpGrIvIh8KPAP65FWaq2NOiVcraa9MkbY35mj8W/U4t9q/rbCfprH37I/dXVmvbR94ZCsLnJ9999t6Z99Eqpo9ErXhWgR/RKOZWGvPqIBr1SzqMhr56gQa+Us2jIq2do0CvlHBryak8a9Eo5g4a82pcGvVKtT0NeHUiDXqnWpiGvDqVBr1Tr0pBXR6JBr1Rr0pBXR1bvoPdubfHw/v2a7VMppSGvylSvoJ/f2KAYCDB29mxN9qeU2qYhr8pW66Cf39gg4Xbz0muv4a3RjUaUUts05FVFahX0GvBK1ZeGvKpYtUGvAa9U/WnIq6pUGvQa8Eo1hoa8qlq5Qa8Br1TjaMirmjhq0GvAK9VYtbr935dE5LGIXNu1rFtEvi4id0vfu2pRljq+Dgt6DXilGq9WR/K/C7zx1LJfAb5pjBkHvll6rBxuv6DXgFeqOWoS8saYbwGrTy3+DPDl0s9fBn6yFmWp4+/poNeAV6p56tkn32eMWQAofe+tY1nqmNkd9BrwSjWPu9kVEJE3gTcBYrEY8/PzDSu7qytKfKW9YeU1QirlPVZtGoi9jgE2ElLxPhKbvtpV6BhwWnvAeW2qtj39A6MNzbKD1DPkl0RkwBizICIDwOO9NjLGXAGuAExOTprBwcE6VulJa2txopFgw8prhEAgRzSSbnY1as5pbXJae8B5baqmPYsL0zQyyw5Sz+6arwGfL/38eeCrdSxLKaXUHmo1hPL3gG8Dz4nIrIh8AfhN4MdF5C7w46XHSimlGqgm3TXGmJ/ZZ9WP1WL/SimlKqNXvCqllINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullINpyCullIPV80beSlUtk82SzbhIpVKHbuv3+3G5XA2olVKto+4hLyIPgU2gCBSMMZP1LlM5x3//q3cxcgZTmD9wu2Ixz3MT/Zw+faoR1VKqZTTqSP5HjTHLDSpLOUg+b+jqOIObgQO3SyRnsU2+QbVSqnVod41D2LaNMQbbtrFtG0SwRJpdLaVUkzUi5A3w/4qIAX7LGHNl90oReRN4EyAWizE/f/DH8lrq6ooSX2lvWHlHZgz5QoF8Pk8+lyNfKJDLb3/PF/IU7AJ2oUjRtrGNjbENYm0H+v2HBYxrE2MMGBDLwrIsXJaF2+XC7Xbjdrnxur14PJ6PvrweLy738evPttwjFPEdvqErwlameDxfz6ckNo/QnhbjtDZV257+gdGGZtlBGhHynzLGzItIL/B1EblljPnWzspS6F8BmJycNIODgw2o0ra1tTjRSLBh5e0lm82STCZJJpNspBJsppKkt9LgFlxeF+J1IR7B5Xfj8rqw3C78bheWy8JyWYgliAiUjtqXMjbRl4vbOzcG2y5gbBu7aLALRexikUy+SCpfwM7bmLSNnStSzBVxIQTag4QDIcKBEMFgiGAoiLuJJzPtwiNcTOAmffCGxRXa/Pmmv55HFY0c0p4W5LQ2VdOexYVpGpll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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# The phidl.geometry library has a handy bounding-box function\n",
    "# which takes a bounding box and creates a rectangle shape for it\n",
    "device_bbox = D.bbox\n",
    "D << pg.bbox(device_bbox, layer = 3)\n",
    "\n",
    "qp(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When we query the properties of D, they will be calculated with respect to this bounding-rectangle.  For instance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Center of Device D:\n",
      "[16.5         0.79715597]\n",
      "X-max of Device D:\n",
      "43.0\n"
     ]
    }
   ],
   "source": [
    "print('Center of Device D:')\n",
    "print(D.center)\n",
    "\n",
    "print('X-max of Device D:')\n",
    "print(D.xmax)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chaining commands\n",
    "\n",
    "Many of the movement/manipulation functions return the object they manipulate.  We can use this to chain multiple commands in a single line.\n",
    "\n",
    "For instance these two expressions:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "rect1.rotate(angle = 37)\n",
    "rect1.move([10,20])\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "...are equivalent to this single-line expression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "rect1.rotate(angle = 37).move([10,20])\n",
    "```"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
